package com.example.demo.server;

import com.example.demo.controller.TestController;
import org.hyperic.sigar.*;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Map;
import java.util.Properties;
import java.util.logging.Logger;

@Service
public class ComputerMesServer {

	@Value("${IP}")
	private String IP;

	//信息概述
	public static final Logger logger = Logger.getLogger(String.valueOf(ComputerMesServer.class));
	public String property() throws UnknownHostException {
		Runtime r = Runtime.getRuntime();
//		Properties props = System.getProperties();
		InetAddress addr;
		addr = InetAddress.getLocalHost();
		String ip = addr.getHostAddress();
		Map<String, String> map = System.getenv();
		String userName = map.get("USERNAME");// 获取用户名
		String computerName = map.get("COMPUTERNAME");// 获取计算机名
		String userDomain = map.get("USERDOMAIN");// 获取计算机域名
//		logger.info("\"用户名\":\"" + userName);
//		logger.info("\"计算机名\":\"" + computerName);
//		logger.info("\"计算机域名\":\"" + userDomain);
//		logger.info("\"本地ip地址\":\"" + ip);
//		logger.info("\"本地主机名\":\"" + addr.getHostName());
//		logger.info("\"JVM可以使用的总内存\":\"" + r.totalMemory());
//		logger.info("\"JVM可以使用的剩余内存\":\"" + r.freeMemory());
//		logger.info("\"JVM可以使用的处理器个数\":\"" + r.availableProcessors());
//		logger.info("\"Java的运行环境版本\"：\"" + props.getProperty("java.version"));
//		logger.info("\"Java的运行环境供应商\"：\"" + props.getProperty("java.vendor"));
//		logger.info("\"Java供应商的URL\"：\"" + props.getProperty("java.vendor.url"));
//		logger.info("\"Java的安装路径\"：\"" + props.getProperty("java.home"));
//		logger.info("\"Java的虚拟机规范版本\"：\"" + props.getProperty("java.vm.specification.version"));
//		logger.info("\"Java的虚拟机规范供应商\"：\"" + props.getProperty("java.vm.specification.vendor"));
//		logger.info("\"Java的虚拟机规范名称：\"" + props.getProperty("java.vm.specification.name"));
//		logger.info("\"Java的虚拟机实现版本\"：\"" + props.getProperty("java.vm.version"));
//		logger.info("\"Java的虚拟机实现供应商\"：\"" + props.getProperty("java.vm.vendor"));
//		logger.info("\"Java的虚拟机实现名称\"：\"" + props.getProperty("java.vm.name"));
//		logger.info("\"Java运行时环境规范版本\"：\"" + props.getProperty("java.specification.version"));
//		logger.info("\"Java运行时环境规范供应商\"：\"" + props.getProperty("java.specification.vender"));
//		logger.info("\"Java运行时环境规范名称\"：\"" + props.getProperty("java.specification.name"));
//		logger.info("\"Java的类格式版本号\"：\"" + props.getProperty("java.class.version"));
//		logger.info("\"Java的类路径\"：\"" + props.getProperty("java.class.path"));
//		logger.info("\"加载库时搜索的路径列表\"：\"" + props.getProperty("java.library.path"));
//		logger.info("\"默认的临时文件路径\"：\"" + props.getProperty("java.io.tmpdir"));
//		logger.info("\"一个或多个扩展目录的路径\"：\"" + props.getProperty("java.ext.dirs"));
//		logger.info("\"操作系统的名称\"：\"" + props.getProperty("os.name"));
//		logger.info("\"操作系统的构架\"：\"" + props.getProperty("os.arch"));
//		logger.info("\"操作系统的版本\"：\"" + props.getProperty("os.version"));
//		logger.info("\"文件分隔符\"：\"" + props.getProperty("file.separator"));
//		logger.info("\"路径分隔符\"：\"" + props.getProperty("path.separator"));
//		logger.info("\"行分隔符\"：\"" + props.getProperty("line.separator"));
//		logger.info("\"用户的账户名称\"：\"" + props.getProperty("user.name"));
//		logger.info("\"用户的主目录\"：\"" + props.getProperty("user.home"));
//		logger.info("\"用户的当前工作目录\"：\"" + props.getProperty("user.dir"));
		String message = "{"+"\"用户名\":\"" + userName+"\",\"计算机名\":\"" + computerName+"\",\"计算机域名\":\"" +
				userDomain+"\",\"本地ip地址\":\"" + ip+"\",\"JVM可以使用的总内存\":\"" + r.totalMemory()+"\",\"JVM可以使用的剩余内存\":\"" +
				r.freeMemory()+"\",\"JVM可以使用的处理器个数\":\"" + r.availableProcessors()+"\"}";

		return message;
	}


	//cpu
	public Map cpu() throws SigarException {
		Sigar sigar = new Sigar();
		System.out.println("cpu总量参数情况 "+sigar.getCpu());
		Cpu cpuAll = sigar.getCpu();
		Map map = cpuAll.toMap();
		return map;
	}
	//cpuPerc
	public String cpuPerc() throws SigarException {
		Sigar sigar = new Sigar();
		CpuPerc cpuAll2 = sigar.getCpuPerc();
		System.out.println("cpu总百分比情况 "+cpuAll2);
		String message = "{"+"\"user\":\""+format(cpuAll2.getUser())+"\",\"system\":\""+format
				(cpuAll2.getSys())+"\",\"nice\":\""+format(cpuAll2.getNice())+"\",\"wait\":\""+format
				(cpuAll2.getWait())+"\",\"idle\":\""+format(cpuAll2.getIdle())+"\"}";
		return message;
	}

	public static String format(double val) {
		String p = String.valueOf(val * 100.0D);
		int ix = p.indexOf(".") + 1;
		String percent = p.substring(0, ix) + p.substring(ix, ix + 1);
		return percent + "%";
	}



	//内存
	public String memory() throws SigarException {
		Sigar sigar = new Sigar();
		Mem mem = sigar.getMem();
		Swap swap = sigar.getSwap();
		String message = "{"+"\"内存总量\":\"" + mem.getTotal() / 1024L /1024L+ "M \","+"\"当前内存使用量\":\"" + mem.getUsed() /
				1024L /1024L+ "M " +
				"\"," +
				"\"当前内存剩余量\":\"" + mem.getFree() / 1024L /1024L+ "M \","+"\"交换区总量\":\"" + swap.getTotal()/ 1024L /1024L +
				"M \"," +
				""+"\"当前交换区使用量\":\"" + swap.getUsed()/ 1024L /1024L + "M \","+"\"当前交换区剩余量\":\"" + swap.getFree()/ 1024L /1024L + "M \""+"}";
		return message;
	}


	public String net() throws Exception {
		Sigar sigar = new Sigar();
		String ifNames[] = sigar.getNetInterfaceList();

		String message = "[";

		for (int i = 0; i < ifNames.length; i++) {
			String name = ifNames[i];
			NetInterfaceConfig ifconfig = sigar.getNetInterfaceConfig(name);
			if(!ifconfig.getAddress().equals(IP)){
				continue;
			}

//			logger.info("\"网络设备名\":\"" + name);// 网络设备名
//			logger.info("\"IP地址\":\"" + ifconfig.getAddress());// IP地址
//			logger.info("\"子网掩码\":\"" + ifconfig.getNetmask());// 子网掩码
			if ((ifconfig.getFlags() & 1L) <= 0L) {
				logger.info("!IFF_UP...skipping getNetInterfaceStat");
				continue;
			}
			NetInterfaceStat ifstat = sigar.getNetInterfaceStat(name);
//			logger.info(name + "\"接收的总包裹数\":\"" + ifstat.getRxPackets());// 接收的总包裹数
//			logger.info(name + "\"发送的总包裹数\":\"" + ifstat.getTxPackets());// 发送的总包裹数
//			logger.info(name + "\"接收到的总字节数\":\"" + ifstat.getRxBytes());// 接收到的总字节数
//			logger.info(name + "\"发送的总字节数\":\"" + ifstat.getTxBytes());// 发送的总字节数
//			logger.info(name + "\"接收到的错误包数\":\"" + ifstat.getRxErrors());// 接收到的错误包数
//			logger.info(name + "\"发送数据包时的错误数\":\"" + ifstat.getTxErrors());// 发送数据包时的错误数
//			logger.info(name + "\"接收时丢弃的包数\":\"" + ifstat.getRxDropped());// 接收时丢弃的包数
//			logger.info(name + "\"发送时丢弃的包数\":\"" + ifstat.getTxDropped());// 发送时丢弃的包数

			String submessage = "{"+"\"网络设备名\":\"" + name+"\",\"IP地址\":\"" + ifconfig.getAddress()+"\",\"子网掩码\":\"" +
					ifconfig.getNetmask()+"\",\"接收的总包裹数\":\"" + ifstat.getRxPackets()+ "\",\"发送的总包裹数\":\"" + ifstat
					.getTxPackets()+ "\",\"接收到的总字节数\":\"" + ifstat.getRxBytes()/ 1024L /1024L+ " M\",\"发送的总字节数\":\"" +
					ifstat.getTxBytes
					()/ 1024L /1024L+ " M\",\"接收到的错误包数\":\"" + ifstat.getRxErrors()+ "\",\"发送数据包时的错误数\":\"" + ifstat
					.getTxErrors()+ "\"," +
					"\"接收时丢弃的包数\":\"" + ifstat.getRxDropped()+ "\",\"发送时丢弃的包数\":\"" + ifstat.getTxDropped()+"\"},";
			message = message+submessage;
		}
		message = message+"]";
		return message.replace("},]","}]");
	}


	public void file() throws Exception {
		Sigar sigar = new Sigar();
		FileSystem fslist[] = sigar.getFileSystemList();
		for (int i = 0; i < fslist.length; i++) {
//			logger.info("分区的盘符名称" + i);
			FileSystem fs = fslist[i];
//			// 分区的盘符名称
//			logger.info("盘符名称:" + fs.getDevName());
//			// 分区的盘符名称
//			logger.info("盘符路径:" + fs.getDirName());
//			logger.info("盘符标志:" + fs.getFlags());//
//			// 文件系统类型，比如 FAT32、NTFS
//			logger.info("盘符类型:" + fs.getSysTypeName());
//			// 文件系统类型名，比如本地硬盘、光驱、网络文件系统等
//			logger.info("盘符类型名:" + fs.getTypeName());
//			// 文件系统类型
//			logger.info("盘符文件系统类型:" + fs.getType());
			FileSystemUsage usage = null;

			usage = sigar.getFileSystemUsage(fs.getDirName());
			switch (fs.getType()) {
				case 0: // TYPE_UNKNOWN ：未知
					break;
				case 1: // TYPE_NONE
					break;
				case 2: // TYPE_LOCAL_DISK : 本地硬盘
//					// 文件系统总大小
//					logger.info(fs.getDevName() + "总大小:" + usage.getTotal() + "KB");
//					// 文件系统剩余大小
//					logger.info(fs.getDevName() + "剩余大小:" + usage.getFree() + "KB");
//					// 文件系统可用大小
//					logger.info(fs.getDevName() + "可用大小:" + usage.getAvail() + "KB");
//					// 文件系统已经使用量
//					logger.info(fs.getDevName() + "已经使用量:" + usage.getUsed() + "KB");
					double usePercent = usage.getUsePercent() * 100D;
//					// 文件系统资源的利用率
//					logger.info(fs.getDevName() + "资源的利用率:" + usePercent + "%");
					break;
				case 3:// TYPE_NETWORK ：网络
					break;
				case 4:// TYPE_RAM_DISK ：闪存
					break;
				case 5:// TYPE_CDROM ：光驱
					break;
				case 6:// TYPE_SWAP ：页面交换
					break;
			}
//			logger.info(fs.getDevName() + "读出：" + usage.getDiskReads());
//			logger.info(fs.getDevName() + "写入：" + usage.getDiskWrites());
		}
		return;
	}
}
